﻿#define _CRT_SECURE_NO_WARNINGS
// ↑ 将本行在代码放在第一行可以避免 scanf的报错问题（仅在VS编译器里）
//【入门】1.C++基础



//【头文件包含】
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<math.h>
#include<string.h> 

#include<iostream>//c++的输入输出流


//【命名空间】
namespace N1
{
	int a = 10;
	int b = 20;
}
namespace N2
{
	int a = 30;
	int b = 40;
}
namespace N3
{
	int a = 50;
	int b = 60;
}



//【结构体声明】


//【函数声明】
void Test1();
void Test2();
void Func(int a = 100);
/*函数重载测试函数*/void Func1(int a, char b);
/*函数重载测试函数*/void Func1(double a, char b);
/*函数重载测试函数*/void Func1(char b, int a);
/*函数重载测试函数*/void Func1(char b);
/*函数重载测试函数*/void Func1();


//【主函数】
int main()
{
	Test1();
	Test2();
	
	return 0;
}

//【函数定义】
/*缺省参数测试函数*/void Func(int a)
{
	std::cout << a << std::endl;
}

/*函数重载测试函数*/void Func1(int a, char b)
{
	std::cout << a << b << std::endl;
}
/*函数重载测试函数*/void Func1(double a, char b)
{
	std::cout << a << b << std::endl;
}
/*函数重载测试函数*/void Func1(char b,int a)
{
	std::cout << a << b << std::endl;
}
/*函数重载测试函数*/void Func1(char b)
{
	std::cout << b << std::endl;
}
/*函数重载测试函数*/void Func1()
{
	std::cout << "a+b" << std::endl;
}

/*测试用例*/void Test1()
{
	printf("****测试用例开始****\n");
	//命名空间
	printf("N1::%d,%d\n",N1::a,N1::b);//使用方式1
	{//使用方式2
		using N2::a, N2::b;
		printf("N2::%d,%d\n", a,b);
	}
	{//使用方式3
		using namespace N3;
		printf("N3::%d,%d\n", a,b);
	}
	int a = 1; double b = 2.2;
	std::cout << a<<"|"<<b<< std::endl;
	std::cout << "Hello world" << std::endl;
	{
	using namespace std;//c++库中所有东西都是放在std命名空间中
	cout << "Hello world"<<endl;
	}
	//缺省参数
	Func();
	Func(10);
	//函数重载
	Func1(10, 'B');
	Func1(10.11, 'B');
	Func1('B',10);
	Func1('B');
	Func1();
	
	printf("****测试用例结束****\n\n");
}
/*测试用例*/void Test2()
{
	printf("****测试用例开始****\n");
	//引用
	int a1 = 5;
	int& ra = a1;//给a取另一个名称叫ra
	double db = a1;//隐式类型转换
	const double db2 = a1;
	const float fl = a1;
	printf("%p\n%p\n", &a1, &ra);
	printf("a1=%d ra=%d db=%f db2=%f f1=%f\n", a1, ra, db, db2, fl);
	printf("****测试用例结束****\n\n");
}


//【笔记】
//1.C++基础
	//命名空间namespace
		//c++中可以创建命名空间对标识符的名称进行本地化，避免命名冲突或污染
		//命名空间内可以定义变量、函数、还可嵌套命名空间
		//同一个工程可以有多个同名的命名空间， 最终这些同名空间会视为同一块命名空间
		//【注】区别于直接定义变量，在命名空间中定义的变量在未使用时不会占用内存仅用于代码组织。
		//【类似】声明结构体：仅定义类型，不分配内存；定义变量时才会分配内存。
	// 使用命名空间
		// 1.加命名空间名称使用：名称::变量
		// 2.使用using将命名空间中成员引入
		// 3.使用using namespace将命名空间引入
	//c++库的std
		//using namespace std; //c++库中所有东西都是放在std命名空间中，因此在使用时注意避免和std命名空间内的命名冲突
		//在工程中常用的std命名在工程前展开，不常用的使用时用加命名空间名称来使用
		//#include<iostream>  iostream是C++的输入输出流头文件，相当于在c中适用printf、scanf 包含头文件<stdio.h>
		//cout是C++的输出函数，使用方法为 cout<<"输出内容"<<endl  其中endl可以作为换行符'\n'使用
		//使用cout时如果不将std展开，则需要再使用时加命名空间 std::cout来实现，同理 std::endl
		//cout在使用时可以自动识别输出变量类型，无需%d|%c...等
	//缺省参数(全缺省、半缺省（部分）)
		//在声明或定义函数时为函数指定一个默认值，如果使用函数时没有指定参数值，则会使用缺省值
		//半缺省必须从右向左连续缺省，不能间隔，缺省放在非缺省后面
		//全缺省，不传参就都不能传参，不能一部分传参一部分用缺省值
	//函数重载
		//允许在同一作用域内有功能类似的重名函数
		//函数名相同，函数的参数类型、个数、顺序不同，任一条件满足就构成函数重载
		//函数重载对函数返回值没有要求，但只有返回值不同不构成重载
		//在使用时，通过规定传递参数的类型来决定使用哪个函数，整形对应整形、浮点型对应浮点型、整形L对应长整型
		//C++之所以可以实现函数重载，是因为在编译时，c++的函数"链接"会包含函数的名称、变量数、类型、顺序等信息，因此可以通过不同内容区分同名函数
	//extern 'C'
		//在函数声明时加上extern 'C'，可以保证c/c++都能找到该函数，编译时是按c语言规则修饰，但这样的函数不支持重载
	//引用 
		// 利用 "变量类型 &新变量名名称 = 原变量名"可以给原变量名取一个新名字，两个变量名称共用同一个内存空间
	// 引用的特性
		//引用在定义时必须初始化，即必须把引用名赋给一个确定的变量名
		//一个变量可以有多个引用,引用时要保持类型一致
		//一个引用如果给了一个实体，那就不能再将他赋给别的实体，只能利用引用改变原变量的值
		//引用对变量的访问可以缩小不能放大，如果原变量为可读可写，则引用名可以仅为只读，但如果原变量为只读，则引用名必须只读
		//如果以只读引用，引用的类型可以不同于原变量类型，引用时是在引用-原变量创建的-类型为引用类型的-临时变量，同样是允许权限的缩小